// useEffect会在react component的mounted，didUpdate以及willUnmount三个生命周期点去执行定义的函数
// useEffect(function () {

// }, []);
let prevDepArr = [],
    effectIndex = 0;
/**
 * 
 * @param {Function} cb 
 * @param {Array} depArr 
 */
function useEffect(cb, depArr) {
    // 判断callback是不是函数
    if (Object.prototype.toString.call(callback) !== '[object Function]') throw new Error('useEffect函数的第一个参数必须是函数');
    // 判断depArr有没有被传递
    if (typeof depArr === 'undefined') {
        cb();
    } else {
        // 判断depsAry是不是数组
        if (Object.prototype.toString.call(depsAry) !== '[object Array]') throw new Error('useEffect函数的第二个参数必须是数组');
        // 获取上一次的状态值
        let prevDeps = prevDepsAry[effectIndex];
        // 将当前的依赖值和上一次的依赖值做对比 如果有变化 调用callback
        let hasChanged = prevDeps ? depsAry.every((dep, index) => dep === prevDeps[index]) === false : true;
        // 判断值是否有变化
        if (hasChanged) {
            callback();
        }
        // 同步依赖值
        prevDepsAry[effectIndex] = depsAry;
        effectIndex++;
    }

};

